package BloodTimeHybernateTest;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

import BloodTimeHybernateDO.FamiliaDO;
import BloodTimeHybernateDO.VampiroDO;

/**
 * 
 * @author Manuel A. Quintero V.
 * 
 */
public class TestFamiliaDO {

	public static void main(String[] args) {
		Configuration configuration = new AnnotationConfiguration();
		configuration.configure("/BloodTimeHybernateDO/hibernate.cfg.xml");
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		// ---------------------------------------------------------------
        // Insert
        // ---------------------------------------------------------------
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		FamiliaDO familia;
		for(int i=1;i<=5;i++){
			familia = new FamiliaDO();
			familia.setNombre("nombre"+i);
			familia.setDescripcion("descripcion"+i);
			familia.setValorInicialDefensa(i);
			familia.setValorInicialFuerza(i);
			familia.setValorInicialHabArmas(i);
			familia.setValorInicialHabNegocios(i);
			familia.setValorInicialSigilosidad(i);
			familia.setValorInicialVelocidad(i);
			for (int j = 1; j <= 5; j++) {
				VampiroDO vampiro = new VampiroDO();
				vampiro.setAlias("nombre"+j*i);
				vampiro.setFamiliaId(familia);
				familia.getVampiroList().add(vampiro);
				session.save(vampiro);
			}
			session.save(familia);
		}
		session.getTransaction().commit();
		session.close();
		
		// ---------------------------------------------------------------
        // Load
        // ---------------------------------------------------------------

		session = sessionFactory.openSession();
		session.beginTransaction();

		familia = null;
		familia = (FamiliaDO) session.load(FamiliaDO.class, 1);
		System.out.println("familia.nombre: " + familia.getNombre());
		
		// ---------------------------------------------------------------
        // Update
        // ---------------------------------------------------------------
		familia.setNombre("otro nombre");

		session.getTransaction().commit();
		session.close();

		// ---------------------------------------------------------------
        // Query
        // ---------------------------------------------------------------

		session = sessionFactory.openSession();
		session.beginTransaction();

		familia = null;
		familia = (FamiliaDO) session.createQuery("FROM FamiliaDO AS f WHERE f.id = '3'").uniqueResult();
		System.out.println("familia.nombre: " + familia.getNombre());

			
		// ---------------------------------------------------------------
        // Delete
        // ---------------------------------------------------------------
		session.delete(familia);

		session.getTransaction().commit();
		session.close();

		// ---------------------------------------------------------------
        // List
        // ---------------------------------------------------------------

		session = sessionFactory.openSession();
		session.beginTransaction();
		 Iterator<VampiroDO> itt;
		List<FamiliaDO> list = session.createCriteria(FamiliaDO.class).list();
		for (FamiliaDO fam : list) {
			System.out.println("vampiros asociados a la familia: "+fam.getNombre());
			itt = fam.getVampiroList().iterator();
			 while (itt.hasNext()) {
			      VampiroDO vampiro = (VampiroDO) itt.next();
			      System.out.println(vampiro.getId());

			      if (vampiro.getId() == 6) {
			        itt.remove();
			        vampiro.setFamiliaId(null);
			      }
			 }
		}

		session.getTransaction().commit();
		session.close();
		

	}

}
